// MMORPG游戏输入处理器
import { GAME_STATES } from './types';
import type { GameState, MousePosition } from './types';

/**
 * 输入处理器类，负责处理玩家输入
 */
export class InputHandler {
  // 输入状态管理器的引用
  private stateManager: { forceStateChange: (state: GameState) => boolean; };

  constructor(stateManager: { forceStateChange: (state: GameState) => boolean; }) {
    this.stateManager = stateManager;
  }

  /**
   * 处理键盘输入
   * @param key 按键名称
   * @param pressed 是否按下
   * @param currentState 当前游戏状态
   */
  public handleKeyInput(key: string, pressed: boolean, currentState: GameState): void {
    console.log(`处理键盘输入: ${key} ${pressed ? '按下' : '释放'}`);
    
    // 根据当前状态和按键执行不同的逻辑
    switch (currentState) {
      case GAME_STATES.EXPLORATION:
        this.handleExplorationKeyInput(key, pressed);
        break;
      case GAME_STATES.COMBAT:
        this.handleCombatKeyInput(key, pressed);
        break;
      case GAME_STATES.MENU:
        this.handleMenuKeyInput(key, pressed);
        break;
      // 可以添加其他状态的键盘处理逻辑
    }
  }

  /**
   * 处理鼠标输入
   * @param action 鼠标动作 (click, move, etc.)
   * @param position 鼠标位置
   * @param button 鼠标按钮 (left, right, middle)
   * @param currentState 当前游戏状态
   */
  public handleMouseInput(
    action: string, 
    position: MousePosition, 
    button?: string, 
    currentState: GameState = GAME_STATES.EXPLORATION
  ): void {
    console.log(`处理鼠标输入: ${action} ${button || ''} 在位置 (${position.x}, ${position.y})`);
    
    // 根据当前状态和鼠标动作执行不同的逻辑
    switch (currentState) {
      case GAME_STATES.EXPLORATION:
        this.handleExplorationMouseInput(action, position, button);
        break;
      case GAME_STATES.COMBAT:
        this.handleCombatMouseInput(action, position, button);
        break;
      // 可以添加其他状态的鼠标处理逻辑
    }
  }

  /**
   * 处理游戏事件
   * @param eventName 事件名称
   * @param eventData 事件数据
   * @returns 是否成功处理了事件
   */
  public handleGameEvent(eventName: string, eventData?: any): boolean {
    console.log(`处理游戏事件: ${eventName}`, eventData);
    
    // 根据事件类型执行不同的逻辑
    switch (eventName) {
      case 'enemy_encountered':
        this.stateManager.forceStateChange(GAME_STATES.COMBAT);
        return true;
      case 'npc_interaction':
        this.stateManager.forceStateChange(GAME_STATES.DIALOGUE);
        return true;
      case 'player_death':
        this.stateManager.forceStateChange(GAME_STATES.DEATH);
        return true;
      // 可以添加其他事件处理逻辑
    }
    
    return false;
  }

  // ================ 私有辅助方法 ================

  /**
   * 处理探索状态下的键盘输入
   * @param key 按键名称
   * @param pressed 是否按下
   */
  private handleExplorationKeyInput(key: string, pressed: boolean): void {
    if (!pressed) return;
    
    switch (key) {
      case 'Escape':
        this.stateManager.forceStateChange(GAME_STATES.MENU);
        break;
      case 'c':
      case 'C':
        this.stateManager.forceStateChange(GAME_STATES.CHARACTER_PANEL);
        break;
      case 'i':
      case 'I':
        this.stateManager.forceStateChange(GAME_STATES.INVENTORY);
        break;
      // 可以添加其他探索状态下的键盘处理
    }
  }

  /**
   * 处理战斗状态下的键盘输入
   * @param key 按键名称
   * @param pressed 是否按下
   */
  private handleCombatKeyInput(key: string, pressed: boolean): void {
    // 战斗状态下的键盘处理逻辑
  }

  /**
   * 处理菜单状态下的键盘输入
   * @param key 按键名称
   * @param pressed 是否按下
   */
  private handleMenuKeyInput(key: string, pressed: boolean): void {
    if (!pressed) return;
    
    if (key === 'Escape') {
      this.stateManager.forceStateChange(GAME_STATES.EXPLORATION);
    }
  }

  /**
   * 处理探索状态下的鼠标输入
   * @param action 鼠标动作
   * @param position 鼠标位置
   * @param button 鼠标按钮
   */
  private handleExplorationMouseInput(
    action: string, 
    position: MousePosition, 
    button?: string
  ): void {
    // 探索状态下的鼠标处理逻辑
  }

  /**
   * 处理战斗状态下的鼠标输入
   * @param action 鼠标动作
   * @param position 鼠标位置
   * @param button 鼠标按钮
   */
  private handleCombatMouseInput(
    action: string, 
    position: MousePosition, 
    button?: string
  ): void {
    // 战斗状态下的鼠标处理逻辑
  }
}